//
//  第二章 基础.swift
//  Documentation
//
//  Created by Toj on 10/13/23.
//

第二章 基础

1. 获得仓库
1.1 从当前目录初始化
git init
会出现一个.git 的目录

1.2. 克隆仓库
git clone 地址 new文件夹名
如果没有文件夹名 clone到当前文件夹内

2. 文件记录状态更新到仓库
已跟踪文件: 指本来就被纳入版本控制管理的文件, 在上次快照中有它们的记录,
工作一段时间后, 它们的状态可能是未更新, 已修改或者 已放入暂存区

未跟踪文件: 其他所有文件都属于未跟踪文件.
它们既没有上次更新时的快照, 也不在当前的暂存区域.
初次克隆某个仓库时, 工作目录中的所有文件都属于已跟踪文件, 且状态为未修改

2.1 当前文件状态
git status

2.2 跟踪新文件 & 暂存状态
git add 文件名/ 路径/ .
文件名: 当前文件夹下某个文件
文件路径: 路径下具体文件路径
.: 全部文件

2.3 暂存已修改文件
git add 文件后再修改文件内容,
git status 查看文件状态 会出现1个文件2中状态
一个是暂存区的状态: 之前调用 git add 后的文件状态
一个是已修改的状态: git add 后修改了文件内容的状态
如果现在git commit 提交的是暂存区的文件内容,
想要提交当前内容需要再次git add 将内容添加到暂存区内

2.4 忽略某些不需要提交的文件
.gitignore 的文件
可以去github有专门统计的库
https://github.com/github/gitignore

.gitignore文件 的格式规范如下:
• 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式最后跟􏰝斜杠(/)说明要忽略的是目录。
• 要忽略指定模式以外的文件或目录，可以在模式前加上惊叹号(!)取􏰝。


# 此为注释 – 将被 Git 忽略
*.a
# 忽略所有 .a 结尾的文件

!lib.a
# 但 lib.a 除外

/TODO
# 仅仅忽略项目根目录下的 TODO 文件，不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件

doc/*.txt
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
*/

2.5 查看已暂存和未暂存的更新
git status 比较简单的看是否加入到暂存区
git diff   查看具体修改内容
此命令比较的是工作目录中当前文件 和 暂存区域快照之间的差异

git diff --cached
git diff --staged
此命令比较的是 已经暂存起来的文件 和 上次提交时的快照之间的差异

2.6 提交更新
git commit 会调用配置的编辑器 进行commit 操作
一般都是 vim 或 emacs
或者调用 git config --global core.editor 进行修改

可以在commit 后面加-m 参数省略编辑器提交过程
git commit -m "log"

在哪个分支提交; 生成的SHA-1校验; 提交了多少修订; 提交了什么文件;
[master（根提交） 5286bf7]  提交内容
 2 files changed, 14 insertions(+)
 create mode 100755 Mac config.txt
 create mode 100644 "\347\273\217\345\205\270\350\257\255\345\275\225"

2.7 跳过使用暂存区域
跳过git add 过程 直接提交
git commit -a -m 'log'
与其说跳过不如说2个命令合成1个命令

2.8 移除文件
2.8.1 移除某个文件
rm 文件名

2.8.2 已经加入到暂存区的文件
需要加入 -f参数, NOTE: f(force: 强制)
git rm -f 文件名
rm 文件名  一样效果

2.8.3 已经加入到暂存区, 但是不想删除文件, 只在暂存区删除文件
git rm --cached 文件名

2.8 移动文件
git mv file_from file_to

3. 查看提交历史
git log
后面可以带参数
• -p: 显示提交的差异
git log -p
• --stat: 仅显示简要的增改行数统计
git log --stat
• --shortstat: 只显示 --stat 中最后的行数修改添加移除统计。
• --name-only: 仅在提交信息后显示已修改的文件清单。
• --name-status: 显示新增、修改、删除的文件清单。
• --abbrev-commit: 仅显示 SHA-1 的前几个字符，而非所有的 40 个字符。
• --relative-date: 使用较短的相对时间显示(比如，“2 weeks ago”)。
• --graph: 显示 ASCII 图形表示的分支合并历史。
• --pretty: 可以指定使用完全不同于默认格式的方式展示提交历史
git log --pretty=oneline
•• oneline: 将每个提交放在一行显示, 这在提交数很大时非常有用
•• short:
•• full:
•• fuller:
•• format: 可以定制要显示的记录格式
git log --pretty=format:"%h - %an, %ar : %s"
••• %H:  提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串
••• %T:  树对象(tree)的完整哈希字串
••• %t:  树对象的简短哈希字串
••• %P:  父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串
••• %an: 作者(author)的名字
••• %ae: 作者的电子邮件地址
••• %ad: 作者修订日期(可以用 -date= 选项定制格式) %ar 作者修订日期，按多久以前的方式显示
••• %cn: 提交者(committer)的名字
••• %ce: 提交者的电子邮件地址
••• %cd: 提交日期
••• %cr: 提交日期，按多久以前的方式显示 %s 提交说明

3.1 限制输出长度
git log --since=2.weeks

4 撤消操作
4.1 修改最后一次提交的log
git commit --amend

如果在提交日志后, 还需要改动其他文件 & 这个提交也想包含这些修改内容
可以先加入到暂存区
git add .
然后再次
git commit --amend

34页
